home *** CD-ROM | disk | FTP | other *** search
- /*
- * Copyright (c) 1995, Silicon Graphics, Inc.
- *
- * Permission to use, copy, modify, distribute, and sell this software and
- * its documentation for any purpose is hereby granted without fee, provided
- * that the name of Silicon Graphics may not be used in any advertising or
- * publicity relating to the software without the specific, prior written
- * permission of Silicon Graphics.
- *
- * THE SOFTWARE IS PROVIDED "AS-IS" AND WITHOUT WARRANTY OF ANY KIND,
- * EXPRESS, IMPLIED OR OTHERWISE, INCLUDING WITHOUT LIMITATION, ANY
- * WARRANTY OF MERCHANTABILITY OR FITNESS FOR A PARTICULAR PURPOSE.
- *
- * IN NO EVENT SHALL SILICON GRAPHICS BE LIABLE FOR ANY SPECIAL, INCIDENTAL,
- * INDIRECT OR CONSEQUENTIAL DAMAGES OF ANY KIND, OR ANY DAMAGES WHATSOEVER
- * RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER OR NOT ADVISED OF THE
- * POSSIBILITY OF DAMAGE, AND ON ANY THEORY OF LIABILITY, ARISING OUT OF OR IN
- * CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
- *
- * OpenGL(TM) is a trademark of Silicon Graphics, Inc.
- */
- /*----------------------------------------------------------------------------
- *
- * file : grafix.c
- *
- * Author : Yusuf Attarwala
- *
- *---------------------------------------------------------------------------*/
- #include <X11/keysym.h>
- #include <strings.h>
- #include "Xmincludes.h"
- #include "globals.h"
- #include "lm.h"
-
- #include <Xm/Protocols.h>
-
- Arg args[40];
- int argcnt;
-
- extern void doExit();
-
- void
- createGraphics(parent)
- Widget parent;
- {
- char *c;
- Widget frameD,frameS;
- Widget glwDbuffer,glwSbuffer;
- Widget gf;
-
- static int firstTime = 1;
- void gfxExposeCB(),
- gfxResizeCB(),
- gfxInitCB();
-
- Atom xaWmDeleteWindow = XmInternAtom(display,"WM_DELETE_WINDOW",TRUE);
-
- argcnt = 0;
- XtSetArg(args[argcnt],XmNtitle, "lmwrap - OPENGL");argcnt++;
- XtSetArg(args[argcnt],XmNiconName,"lmwrapO");argcnt++;
- XtSetArg(args[argcnt],XmNkeyboardFocusPolicy, XmPOINTER);argcnt++;
- XtSetArg(args[argcnt],XmNdeleteResponse, XmUNMAP);argcnt++;
- XtSetArg(args[argcnt],XmNdefaultPosition, False);argcnt++;
- XtSetArg(args[argcnt],XmNminWidth, 300);argcnt++;
- XtSetArg(args[argcnt],XmNminAspectX, 1);argcnt++;
- XtSetArg(args[argcnt],XmNminAspectY, 1);argcnt++;
- XtSetArg(args[argcnt],XmNmaxAspectX, 1);argcnt++;
- XtSetArg(args[argcnt],XmNmaxAspectY, 1);argcnt++;
-
- quadObj = gluNewQuadric(); /* for drawing sphere */
-
-
- gf = XtCreatePopupShell("ui",
- topLevelShellWidgetClass,parent,args,argcnt);
-
- XmAddWMProtocolCallback(gf,xaWmDeleteWindow,doExit,0);
-
- /* double buffer widget */
- argcnt = 0;
- XtSetArg(args[argcnt], XmNbackground,BlackPixel(display,screen)); argcnt++;
- frameD = XtCreateWidget("frameD", xmFrameWidgetClass,
- gf, args, argcnt);
-
- XtManageChild(frameD);
-
- argcnt = 0;
- argcnt = 0;
- XtSetArg(args[argcnt], GLwNrgba, TRUE); argcnt++;
- XtSetArg(args[argcnt], GLwNredSize, 1); argcnt++;
- XtSetArg(args[argcnt], GLwNgreenSize, 1); argcnt++;
- XtSetArg(args[argcnt], GLwNblueSize, 1); argcnt++;
- XtSetArg(args[argcnt], GLwNdepthSize, 24); argcnt++;
- XtSetArg(args[argcnt], GLwNdoublebuffer, TRUE); argcnt++;
- XtSetArg(args[argcnt], GLwNallocateBackground, TRUE); argcnt++;
- glwDbuffer = GLwCreateMDrawingArea(frameD, "gfx", args, argcnt);
- XtManageChild(glwDbuffer);
-
- XtAddCallback(glwDbuffer, GLwNexposeCallback, gfxExposeCB, NULL);
- XtAddCallback(glwDbuffer, GLwNresizeCallback, gfxResizeCB, NULL);
- XtAddCallback(glwDbuffer, GLwNginitCallback, gfxInitCB, NULL);
-
- /* default to double buffer */
- glw = glwDbuffer;
- XtManageChild(gf);
-
- if (firstTime) {
- firstTime = 0;
- }
-
- GLwDrawingAreaMakeCurrent(glw, glxc);
- glMatrixMode(GL_PROJECTION);
- glOrtho(-10.0,10.0,-10.0,10.0,-5.0,10.0);
- glMatrixMode(GL_MODELVIEW);
- glLoadIdentity();
-
- }
-
- void
- gfxExposeCB(w,cd,call)
- Widget w;
- XtPointer *cd;
- XtPointer *call;
- {
- GLwDrawingAreaMakeCurrent(glw, glxc);
- drawScene();
- }
-
- void
- gfxResizeCB(w,cd,call)
- Widget w;
- XtPointer *cd;
- XtPointer *call;
- {
- GLwDrawingAreaCallbackStruct *draw_struct;
- draw_struct = (GLwDrawingAreaCallbackStruct *) call;
-
- if (draw_struct->event != (XEvent *)NULL) {
- window_width = draw_struct->event->xconfigure.width;
- window_height = draw_struct->event->xconfigure.height;
- }
- else {
- argcnt = 0;
- XtSetArg(args[argcnt], XmNwidth, &window_width); argcnt++;
- XtSetArg(args[argcnt], XmNheight, &window_height); argcnt++;
- XtGetValues(w,args,argcnt);
- }
-
- GLwDrawingAreaMakeCurrent(glw, glxc);
- glViewport(0, 0, draw_struct->width-1, draw_struct->height-1);
- drawScene();
-
-
- }
-
- void
- gfxInitCB(w,cd,call)
- Widget w;
- XtPointer *cd;
- XtPointer *call;
- {
- XVisualInfo *vi;
- GLwDrawingAreaCallbackStruct *draw_struct;
- draw_struct = (GLwDrawingAreaCallbackStruct *) call;
-
- XtSetArg(args[0], GLwNvisualInfo, &vi);
- XtGetValues(w, args, 1);
-
- glxc = glXCreateContext(XtDisplay(w), vi, 0, GL_TRUE);
-
- GLwDrawingAreaMakeCurrent(glw, glxc);
-
- glClearColor(0.0,0.0,0.0,1.0);
-
- /* irisGL style calls, calls our lmdef */
-
- lmdef(DEFMATERIAL,MAT_BRASS,SZ(mat_brass),mat_brass);
- lmdef(DEFMATERIAL,MAT_REDPLASTIC,SZ(mat_redplastic),mat_redplastic);
- lmdef(DEFMATERIAL,MAT_SILVER,SZ(mat_silver),mat_silver);
- lmdef(DEFMATERIAL,MAT_GRNPLASTIC,SZ(mat_grnplastic),mat_grnplastic);
-
- lmdef(DEFLMODEL, LTM_INFINITE,SZ(infinite),infinite);
- lmdef(DEFLMODEL, LTM_LOCAL,SZ(local),local);
- lmdef(DEFLMODEL, LTM_INF_TWO,SZ(infinite),infinite);
-
- lmdef(DEFLIGHT, LT_INF_WHITE,SZ(white_inf_light),white_inf_light);
- lmdef(DEFLIGHT, LT_INF_RED,SZ(red_inf_light),red_inf_light);
-
- glEnable(GL_LIGHT0);
- glEnable(GL_DEPTH_TEST);
- }
-
- Boolean
- trackBallMotion()
- {
- anglex += 2.0;
- angley += 2.0;
- anglez += 2.0;
- if (anglex >= 360.0) anglex = 0.;
- if (angley >= 360.0) angley = 0.;
- if (anglez >= 360.0) anglez = 0.;
-
- refresh = 1;
- drawScene();
- return(0);
- }
-
- void
- animation(flag)
- int flag;
- {
- Boolean trackBallMotion();
- static XtWorkProcId wpid;
-
- if (flag == 0) {
- if (doTumble == 1) XtRemoveWorkProc(wpid);
- doTumble = 0;
- }
- else if (doTumble == 0) {
- doTumble = 1;
- wpid = XtAppAddWorkProc(appContext,trackBallMotion,NULL);
- }
- }
-